package gui;
import logica.*;
import javax.swing.*;
import java.awt.*;
import java.util.*;
import java.awt.event.*;
/**
**********************************************************************************************<br/>
*Crea un objeto de la aplicacion para que se ejecute
* @author Jefferson Amado Peña Torres
**********************************************************************************************
* @see Ventana
* @version 0.1
*/

public class Visualizador  implements MouseListener, MouseMotionListener{

	private JInternalFrame visualVentana;
 	public Tablero tablero;
 	JButton btVerArchivo,btGuardar;
 	VerticeGrafico pun[];
 	Container contenedor;
 	ArrayList<VerticeGrafico> puntos;
 	ArrayList<AsociacionGrafica> aristas;
 	int contador;
 	int j,i;
 	int x,y;

	public Visualizador(JInternalFrame visualVentana,Grafo grf,boolean esSalida){
		this.visualVentana=visualVentana;
		this.contenedor=visualVentana.getContentPane();
 
 		this.tablero = new Tablero();
 		this.tablero.setBounds(10, 10, visualVentana.getWidth()-30, visualVentana.getHeight()-65);
 		this.tablero.setBorder(BorderFactory.createBevelBorder(0));
 		this.tablero.setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
		this.btVerArchivo= new JButton("Ver Archivo");
                this.btGuardar= new JButton("Guardar");
 		this.puntos = new ArrayList<VerticeGrafico>();
 		this.aristas = new ArrayList<AsociacionGrafica>();
 				
 		this.pun = new VerticeGrafico[2];
 		this.pun[0]=null;
 		this.pun[1]=null;

 		this.visualVentana.setLayout(null);
 		this.contenedor.add(tablero);
 		this.tablero.addMouseListener(this);
 		this.tablero.addMouseMotionListener(this);

 		for(int nVertices=1;nVertices<grf.getNVertices()+1;nVertices++){
			this.pintarVerticeEnVisualizador("v:"+nVertices);
			//System.out.println("visualizador con <:"+i+">");
 		}
		ArrayList<Relacion> arrayRelaciones=(ArrayList<Relacion>)grf.getAristas().clone(); //array de Relaciones ascendente segun su peso
                for(int nRelaciones=0;nRelaciones<grf.getNRelaciones();nRelaciones++){
                    Relacion rel=arrayRelaciones.get(nRelaciones);
                    this.pintarAristaEnVisualizador((VerticeGrafico)this.puntos.get(Integer.parseInt(rel.getVerticePartida())-1),(VerticeGrafico)this.puntos.get(Integer.parseInt(rel.getVerticeLlegada())-1),rel.getCosto());
                }
                if(!esSalida){
                    this.btVerArchivo.setBounds(10,  visualVentana.getHeight()-55, 130, 20);
                    this.contenedor.add(btVerArchivo);
                }else{
                    this.btVerArchivo.setBounds(10,  visualVentana.getHeight()-55, 120, 20);
                    this.btGuardar.setBounds(140,  visualVentana.getHeight()-55, 100, 20);
                    this.contenedor.add(btVerArchivo);
                    this.contenedor.add(btGuardar);
                }
	}
	void pintarAristaEnVisualizador(VerticeGrafico verticeA,VerticeGrafico verticeB,double costo){
		AsociacionGrafica arista=new AsociacionGrafica(verticeA, verticeB,costo);
			this.aristas.add(arista);
			this.tablero.setAristas(aristas);
			arista.pintarRecta(this.tablero.getGraphics());
			//this.tablero.repaint();	
	}
	void pintarVerticeEnVisualizador(String nombre){
		VerticeGrafico punto = new VerticeGrafico((int) (Math.random()*200+5), (int) (Math.random()*200+5), nombre); //ramdom en coordenadas
			this.puntos.add(punto);
			this.tablero.setPuntos(puntos);
			punto.pintarVerticeGrafico(tablero.getGraphics());
	}
	public void setVisible(boolean ver){
		visualVentana.setVisible(ver);
	}
	public void cleanVisualizador(){
		for(int i=0;i<tablero.getNeo().size();i++){
			AsociacionGrafica arista=(AsociacionGrafica)tablero.getNeo().get(i);
			arista.setColor(new Color(0,128,128));
		}
		this.tablero.getNeo().clear();
		this.tablero.estado=false;
		this.tablero.repaint(); 
	}
	public void mousePressed(MouseEvent arg0){
		contador=0;
		for (int i = 0; i < puntos.size(); i++){
			if (puntos.get(i).ecuacionDeCirculo(arg0.getPoint())){
				puntos.get(i).setColorPunto(Color.RED);
				pun[contador] = puntos.get(i);
				break;
			}
		}
		contador=0;
		this.tablero.repaint();
 	}
 	public void mouseClicked(MouseEvent evento){}
	public void mouseEntered(MouseEvent arg0){}
 	public void mouseExited(MouseEvent arg0){}
	public void mouseReleased(MouseEvent arg0){
 		if(pun[0]!=null)
 			pun[0].setColorPunto(Color.BLUE);
 		tablero.repaint();
 		tablero.punto=false;
 		contador=0;
 		pun[0]=null;
 		pun[1]=null;
 	}
 	public void mouseDragged(MouseEvent e) {
 		try{
		Point ubicacion=new Point(e.getX()-5,e.getY()-5);
		pun[0].setUbicacion(ubicacion);
		tablero.repaint();
		}catch(Exception a){
			//System.out.println("arrastra sin objetivo");
		}
 	}
 	public void mouseMoved(MouseEvent e) {
		for (int i = 0; i < puntos.size(); i++){
			if (puntos.get(i).ecuacionDeCirculo(e.getPoint()))
				puntos.get(i).pintarVerticeGrafico(tablero.getGraphics(), Color.RED);
			else
				puntos.get(i).pintarVerticeGrafico(tablero.getGraphics(), Color.BLUE);
		}
 	}
}
